const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const sqlite3 = require('sqlite3').verbose();
const path = require('path');

const app = express();
const PORT = 3003;

// 中间件
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 数据库路径
const dbPath = path.join(__dirname, 'database.db');

// 初始化数据库
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('Error opening database:', err.message);
  } else {
    console.log('Connected to SQLite database.');
    initializeDatabase();
  }
});

// 初始化数据库表
function initializeDatabase() {
  // 创建文件表
  db.run(`
    CREATE TABLE IF NOT EXISTS files (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL UNIQUE,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )
  `);

  // 创建配置数据表
  db.run(`
    CREATE TABLE IF NOT EXISTS config_data (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      file_id INTEGER,
      sequence_number INTEGER,
      type TEXT,
      start_addr TEXT,
      data_type INTEGER,
      variable TEXT,
      description TEXT,
      note TEXT,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
      FOREIGN KEY (file_id) REFERENCES files (id) ON DELETE CASCADE
    )
  `);
  
  // 添加note字段（如果表已存在但没有note字段）
  db.run(`ALTER TABLE config_data ADD COLUMN note TEXT`, (err) => {
    // 忽略错误，因为字段可能已经存在
  });
  
  // 添加unit字段（如果表已存在但没有unit字段）
  db.run(`ALTER TABLE config_data ADD COLUMN unit TEXT`, (err) => {
    // 忽略错误，因为字段可能已经存在
  });
  
  // 添加value_type字段（如果表已存在但没有value_type字段）
  db.run(`ALTER TABLE config_data ADD COLUMN value_type TEXT`, (err) => {
    // 忽略错误，因为字段可能已经存在
  });

  console.log('Database tables initialized.');
}

// API路由

// 获取所有文件
app.get('/api/files', (req, res) => {
  db.all('SELECT * FROM files ORDER BY updated_at DESC', (err, rows) => {
    if (err) {
      res.status(500).json({ error: err.message });
      return;
    }
    res.json(rows);
  });
});

// 创建新文件
app.post('/api/files', (req, res) => {
  const { name } = req.body;
  
  if (!name) {
    res.status(400).json({ error: 'File name is required' });
    return;
  }

  db.run(
    'INSERT INTO files (name) VALUES (?)',
    [name],
    function(err) {
      if (err) {
        if (err.message.includes('UNIQUE constraint failed')) {
          res.status(400).json({ error: 'File name already exists' });
        } else {
          res.status(500).json({ error: err.message });
        }
        return;
      }
      res.json({ id: this.lastID, name });
    }
  );
});

// 获取文件的配置数据
app.get('/api/files/:fileId/data', (req, res) => {
  const { fileId } = req.params;
  
  db.all(
    'SELECT * FROM config_data WHERE file_id = ? ORDER BY sequence_number',
    [fileId],
    (err, rows) => {
      if (err) {
        res.status(500).json({ error: err.message });
        return;
      }
      res.json(rows);
    }
  );
});

// 保存文件的配置数据
app.post('/api/files/:fileId/data', (req, res) => {
  const { fileId } = req.params;
  const { data } = req.body;

  if (!Array.isArray(data)) {
    res.status(400).json({ error: 'Data must be an array' });
    return;
  }

  // 开始事务
  db.serialize(() => {
    db.run('BEGIN TRANSACTION');

    // 删除现有数据
    db.run('DELETE FROM config_data WHERE file_id = ?', [fileId], (err) => {
      if (err) {
        db.run('ROLLBACK');
        res.status(500).json({ error: err.message });
        return;
      }

      // 插入新数据
      const stmt = db.prepare(`
        INSERT INTO config_data 
        (file_id, sequence_number, type, start_addr, data_type, unit, value_type, variable, description, note) 
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
      `);

      let hasError = false;
      data.forEach((item, index) => {
        if (hasError) return;
        
        stmt.run([
          fileId,
          item.sequenceNumber || index + 1,
          item.type || '',
          item.startAddr || '',
          item.dataType || 1,
          item.unit || '',
          item.valueType || '',
          item.variable || '',
          item.description || '',
          item.note || ''
        ], (err) => {
          if (err && !hasError) {
            hasError = true;
            db.run('ROLLBACK');
            res.status(500).json({ error: err.message });
          }
        });
      });

      stmt.finalize((err) => {
        if (err || hasError) {
          if (!hasError) {
            db.run('ROLLBACK');
            res.status(500).json({ error: err.message });
          }
          return;
        }

        // 更新文件的修改时间
        db.run(
          'UPDATE files SET updated_at = CURRENT_TIMESTAMP WHERE id = ?',
          [fileId],
          (err) => {
            if (err) {
              db.run('ROLLBACK');
              res.status(500).json({ error: err.message });
              return;
            }

            db.run('COMMIT');
            res.json({ message: 'Data saved successfully', count: data.length });
          }
        );
      });
    });
  });
});

// 删除文件
app.delete('/api/files/:fileId', (req, res) => {
  const { fileId } = req.params;
  
  db.run('DELETE FROM files WHERE id = ?', [fileId], function(err) {
    if (err) {
      res.status(500).json({ error: err.message });
      return;
    }
    
    if (this.changes === 0) {
      res.status(404).json({ error: 'File not found' });
      return;
    }
    
    res.json({ message: 'File deleted successfully' });
  });
});

// 重命名文件
app.put('/api/files/:fileId', (req, res) => {
  const { fileId } = req.params;
  const { name } = req.body;
  
  if (!name) {
    res.status(400).json({ error: 'File name is required' });
    return;
  }

  db.run(
    'UPDATE files SET name = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
    [name, fileId],
    function(err) {
      if (err) {
        if (err.message.includes('UNIQUE constraint failed')) {
          res.status(400).json({ error: 'File name already exists' });
        } else {
          res.status(500).json({ error: err.message });
        }
        return;
      }
      
      if (this.changes === 0) {
        res.status(404).json({ error: 'File not found' });
        return;
      }
      
      res.json({ message: 'File renamed successfully' });
    }
  );
});

// 错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Something went wrong!' });
});

// 启动服务器
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

// 优雅关闭
process.on('SIGINT', () => {
  console.log('\nShutting down server...');
  db.close((err) => {
    if (err) {
      console.error('Error closing database:', err.message);
    } else {
      console.log('Database connection closed.');
    }
    process.exit(0);
  });
});